/*
 * @Author: wangyingjie 2778809626@qq.com
 * @Date: 2025-11-19 13:45:15
 * @LastEditors: wangyingjie 2778809626@qq.com
 * @LastEditTime: 2025-11-20 14:01:43
 * @FilePath: \VTKModelStudio\VTKModelStudio.h
 * @Description:
 */
#ifndef VTKMODELSTUDIO_H
#define VTKMODELSTUDIO_H

// #include "core_lib_export.h"

#include <iostream>
#include <QObject>
#include <QWidget>
#include <QString>
#include <QColor>
#include <QTimer>

class vtkActor;
class vtkLight;
class vtkPlane;
class vtkRenderer;
class vtkSTLReader;
class vtkOBJReader;
class vtkAxesActor;
class vtkTransform;
class vtkClipDataSet;
class vtkShrinkFilter;
class vtkDataSetMapper;
class vtkInteractorStyle;
class vtkGenericOpenGLRenderWindow;
class vtkAnnotatedCubeActor;
class vtkOrientationMarkerWidget;
class vtkDiskSource;
class vtkFollower;
class vtkTextActor3D;

#include "VTKCompassStudio.h"

//// 在现有头文件基础上添加
// #include <VTKCompassStudio.h>
// #include <vtkTextProperty.h>
// #include <vtkVectorText.h>
// #include <vtkPolyDataMapper.h>
// #include <vtkFollower.h>
// #include <vtkDiskSource.h>
// #include <vtkProperty.h>

// VTK 相关头文件
#include <vtkSmartPointer.h>

// Qt VTK 集成
#include <QVTKOpenGLNativeWidget.h>

// TODO:姿态指示器指针xyz标签的大小设置 , 背景添加透明度

class VTKModelStudio : public QVTKOpenGLNativeWidget
{
    Q_OBJECT

  public:
    explicit VTKModelStudio(QWidget* parent = nullptr);
    ~VTKModelStudio();

    // 模型加载和管理
    bool loadModel(const std::string& file);
    bool loadStl(const std::string& file);
    bool loadObj(const std::string& file);
    void clearModel();
    bool isModelLoaded()
    {
        return m_modelLoaded;
    }
    // 启用或禁用鼠标交互功能
    void setMouseInteractionEnabled(bool enabled);
    bool isMouseInteractionEnabled()
    {
        return m_mouseInteractionEnabled;
    }

    // 重置相机视角到默认位置
    void resetCamera();
    // 设置相机位置坐标
    void setCameraPosition(double x, double y, double z);
    // 设置相机焦点坐标
    void setCameraFocalPoint(double x, double y, double z);
    // 设置相机向上方向向量
    void setCameraViewUp(double x, double y, double z);
    // 相机缩放控制
    void zoomCamera(double factor);

    // 航向、俯仰、横滚控制 (相对于模型本地坐标系: -180~180)
    void setModelRotation(double yaw, double pitch, double roll);
    void setYaw(double angle);
    void setPitch(double angle);
    void setRoll(double angle);

    // 模型外观控制
    void setModelColor(double r, double g, double b);
    void setModelColor(const QColor& color);
    // 设置模型透明度（范围0-1）
    void setModelOpacity(double opacity);
    // 设置模型显示模式：0=点，1=线框，2=表面
    void setModelRepresentation(int representation);

    // 背景控制
    void setBackgroundColor(double r, double g, double b);
    void setBackgroundColor(const QColor& color);
    // 启用或禁用渐变背景
    void setGradientBackground(bool enabled);
    // 设置渐变背景色（两个角的颜色）
    void setBackgroundGradient(double r1, double g1, double b1, double r2, double g2, double b2);

    // 光照控制
    // 启用或禁用光照效果
    void setLightEnabled(bool enabled);
    // 设置光源强度
    void setLightIntensity(double intensity);
    // 设置光源位置坐标
    void setLightPosition(double x, double y, double z);
    // 设置光源焦点坐标
    void setLightFocalPoint(double x, double y, double z);
    // 获取光源位置
    void getLightPosition(double& x, double& y, double& z);
    // 获取光源焦点
    void getLightFocalPoint(double& x, double& y, double& z);

    // 坐标轴控制
    // 显示或隐藏世界坐标轴
    void setAxesWorldVisible(bool visible);
    // 设置世界坐标轴位置坐标
    void setAxesWorldPosition(double x, double y, double z);

    // 姿态指示器控制
    // 显示或隐藏姿态指示器
    void setAttitudeMarkerVisible(bool visible);
    // 设置姿态指示器位置和大小
    void setAttitudeMarkerViewport(double x, double y, double width, double height);
    // 启用或禁用姿态指示器位置移动
    void setAttitudeMarkerInteractive(bool interactive);
    // 获取姿态指示器是否可见
    bool isAttitudeMarkerVisible() const
    {
        return m_attitudeMarkerVisible;
    }

  public:
    // 罗盘控制
    VTKCompassStudio* compass;

    // 过滤器
    // 启用或禁用收缩过滤器，并设置收缩因子
    void setShrinkFilterEnabled(bool enabled, double factor = 0.5);
    // 启用或禁用裁剪过滤器
    void setClipFilterEnabled(bool enabled);
    // 设置裁剪平面的原点和法向量
    void setClipPlane(double originX, double originY, double originZ, double normalX, double normalY, double normalZ);

    // 渲染控制
    void render();
    void requestRender();

    QColor getBackgroundColor() const;
    QColor getBackgroundColor2() const;

    // 获取内部组件（用于高级操作）
    vtkRenderer* getRenderer();
    vtkRenderWindow* getRenderWindow();

  private Q_SLOTS:
    void onRenderTimeout();

  Q_SIGNALS:

  protected:
    void initializeVTK();         // 初始化VTK环境
    void setupInteractorStyle();  // 设置交互器样式
    void setupLighting();         // 设置光照参数
    void setupAxes();             // 设置坐标轴参数
    void setupAttitudeMarker();   // 设置姿态指示器
    void applyShrinkFilter();     // 应用收缩过滤器
    void applyClipFilter();       // 应用裁剪过滤器
    void getModelStatistics();    // 计算模型统计信息
    void setupCompass();          // 初始化罗盘

    void updateAxesScale();  // 根据模型尺寸更新坐标轴比例

  private:
    // VTK 核心组件
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> m_renderWindow;  // OpenGL渲染窗口
    vtkSmartPointer<vtkRenderer> m_renderer;                       // 场景渲染器
    vtkSmartPointer<vtkInteractorStyle> m_interactorStyle;         // 鼠标交互样式

    // 模型相关
    vtkSmartPointer<vtkSTLReader> m_stlReader;                 // STL文件读取器
    vtkSmartPointer<vtkOBJReader> m_objReader;                 // OBJ文件读取器
    std::vector<vtkSmartPointer<vtkDataSetMapper>> m_mappers;  // 数据映射器集合
    std::vector<vtkSmartPointer<vtkActor>> m_actors;           // 模型演员集合

    // 光照和坐标轴
    vtkSmartPointer<vtkLight> m_light;                   // 光源对象
    bool m_lightEnabled;                                 // 光源启用状态
    vtkSmartPointer<vtkAxesActor> m_axesWorld;           // 世界坐标轴对象
    vtkSmartPointer<vtkTransform> m_axesWorldTransform;  // 世界坐标轴变换对象

    // 姿态指示器
    vtkSmartPointer<vtkOrientationMarkerWidget> m_attitudeMarker;  // 方向标记小部件
    vtkSmartPointer<vtkAxesActor> m_attitudeAxes;                  // 方向坐标轴
    vtkSmartPointer<vtkTransform> m_attitudeTransform;             // 模型姿态指示器变换
    bool m_attitudeMarkerVisible;                                  // 姿态指示器可见性

    // 过滤器
    vtkSmartPointer<vtkShrinkFilter> m_shrinkFilter;  // 收缩过滤器
    vtkSmartPointer<vtkClipDataSet> m_clipFilter;     // 裁剪数据集过滤器
    vtkSmartPointer<vtkPlane> m_clipPlane;            // 裁剪平面

    // 状态标志
    bool m_modelLoaded;              // 模型是否已加载标志
    bool m_shrinkFilterEnabled;      // 收缩过滤器启用状态
    bool m_clipFilterEnabled;        // 裁剪过滤器启用状态
    bool m_mouseInteractionEnabled;  // 鼠标交互启用状态

    vtkSmartPointer<vtkTransform> m_modelTransform;  // 模型变换对象
    double m_currentYaw;                             // 当前航向角
    double m_currentPitch;                           // 当前俯仰角
    double m_currentRoll;                            // 当前横滚角

    // 节流渲染
    QTimer* m_renderTimer;
    bool m_renderPending;

    // 统计信息
    double m_lengthX;  // X方向尺寸
    double m_lengthY;  // Y方向尺寸
    double m_lengthZ;  // Z方向尺寸
    double m_centerX;  // 中心点X坐标
    double m_centerY;  // 中心点Y坐标
    double m_centerZ;  // 中心点Z坐标
    int m_cells;       // 单元数信息
    int m_points;      // 顶点数信息

    // 当前模型文件路径
    QString m_currentModelPath;  // 当前加载的模型文件路径
};

#endif  // VTKMODELSTUDIO_H